对于 x,y,z 三个操作,我们先考虑 y,z 两个操作的情况。
f[i] 表示通过 y,z 两个操作可以到达的 modx=i 最小的楼层。
可以得知:f[i+y]=f[i]+y,f[i+z]=f[i]+z.
对于最短路,我们可以用一下形式建边:
1 | add(i,(i+y)%x,y); add(i,(i+z)%x,z); |
没问题吧?%x
是必须要做的操作,上文讲了。
那如何统计答案呢?
首先,如果这个 “最小的楼层” 超出了 H ,那么显然是不用统计的。否则,我们将这样统计:ans+=(H-f[i])/x+1;
为什么要这样写呢?想想,现在我们知道了这个最小楼层,我们可以到达这个最小楼层,对吧?如果现在以这个最小楼层为起点,我们可以选择在往上跳 x 层,或者是 2x 层….知道 nx 层,(n+1)x就会超出 H,这时上面的式子就好理解多了。
Code:(可以不用 堆优Dijstra,没必要,用 Spfa 就行了)
1 |
|
文章作者:Qiuly
发布时间:2019年02月15日 - 00:00
最后更新:2019年03月29日 - 13:54
原始链接:http://qiulyblog.github.io/2019/02/15/[题解]luoguP3403/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
v1.5.2